#ifndef _STACK_H_
#define _STACK_H_

#include <stddef.h>
#include <stdbool.h>
#include "slist.h"
#include "util.h"

#ifdef __cplusplus
extern "C" {
#endif

// 栈节点（复用 slist 的节点结构）
typedef struct _snode stack_node_t;

// 栈结构
typedef struct {
    stack_node_t *top;  // 栈顶指针
} stack_t;

/**
 * @brief 初始化栈
 * @param stack 栈指针
 */
static inline void stack_init(stack_t *stack) 
{
	stack->top = NULL;
}

/**
 * @brief 检查栈是否为空
 * @param stack 栈指针
 * @return true 为空，false 非空
 */
static inline bool stack_is_empty(stack_t *stack) 
{
	return (stack->top == NULL);
}

/**
 * @brief 压栈（元素添加到栈顶）
 * @param stack 栈指针
 * @param node 待添加的节点
 */
static inline void stack_push(stack_t *stack, stack_node_t *node) 
{
	node->next = stack->top;
	stack->top = node;
}

/**
 * @brief 弹栈（移除并返回栈顶元素）
 * @param stack 栈指针
 * @return 栈顶节点指针（若栈为空返回 NULL）
 */
static inline stack_node_t *stack_pop(stack_t *stack) 
{
	if (stack_is_empty(stack)) {
		return NULL;
	}
	stack_node_t *node = stack->top;
	stack->top = node->next;
	return node;
}

/**
 * @brief 查看栈顶元素（不移除）
 * @param stack 栈指针
 * @return 栈顶节点指针（若栈为空返回 NULL）
 */
static inline stack_node_t *stack_peek(stack_t *stack) 
{
	return stack->top;
}

// 通过栈节点获取外层容器
#define STACK_CONTAINER(node, type, member) \
    ((node) ? CONTAINER_OF((node), type, member) : NULL)

// 安全遍历栈的容器（允许在遍历时删除节点）
#define STACK_FOR_EACH_CONTAINER_SAFE(stack, cn, cns, member)           \
    for (cn = STACK_CONTAINER(stack_peek(stack), typeof(*cn), member),   \
         cns = (cn) ? STACK_CONTAINER((cn)->member.next, typeof(*cn), member) : NULL; \
         cn != NULL;                                                     \
         cn = cns, cns = (cn) ? STACK_CONTAINER((cn)->member.next, typeof(*cn), member) : NULL)

#ifdef __cplusplus
}
#endif

#endif /* _STACK_H_ */
